home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 5
/
Aminet 5 - March 1995.iso
/
Aminet
/
misc
/
amag
/
AM9402_2.lha
/
tips & tricks
/
closewindow.asm
< prev
next >
Wrap
Assembly Source File
|
1993-12-27
|
7KB
|
261 lines
*******************************************************************
* Demonstration zur Funktion "WindowClose" *
*-----------------------------------------------------------------*
* *
* Dieses Programm schließt alle Fenster auf der Workbench. *
* Aufruf von der CLI/Shell: [CloseWindow] ohne Parameter *
* *
* Beschreibung: *
* *
* Ausgehend vom Ersten geöffneten Fenster auf der Workbench, *
* schickt es jedem eine Nachricht vom Typ IDCMP_CLOSEWINDOW, was *
* bewirkt, daß, sofern ein Close-Gadget vorhanden ist, das Fenster*
* geschlossen wird und alle zusätzlichen Resourcen vom System und *
* dem zuständigen Task freigegeben werden! *
* *
* Benutzter Assembler: *
* MaxonASM in der Version 1.1 *
* Tabulator: 16 *
* *
* Die Demo läßt sich aber auch mit allen anderen Assemblern *
* übersetzen! *
* Vorraussetzung ist allerdings das Vorhandensein von OS 2.0 und *
* den dazugehörigen Includes! *
* *
*******************************************************************
INCLUDE intuition/intuition.i
INCLUDE intuition/intuitionbase.i
INCLUDE intuition/intuition_lib.i
INCLUDE exec/devices.i
INCLUDE exec/exec_lib.i
INCLUDE devices/input.i
INCLUDE devices/inputevent.i
*----Benötigte Resourcen öffnen---
Main move.l $4.w,a6
lea IntName(pc),a1
moveq #37,d0 OS 2.0!
jsr _LVOOpenLibrary(a6)
lea _IntBase(pc),a0
move.l d0,(a0)
beq .NoInt
move.l d0,a6
lea InpName(pc),a0
moveq #0,d0
moveq #IOSTD_SIZE,d1
bsr _OpenDevice ;Input.device öffnen
lea _IOReq(pc),a0
move.l d0,(a0)
beq.s .NoDev
*----Workbench-Screen finden---
suba.l a0,a0 WBenchScreen
jsr _LVOLockPubScreen(a6)
move.l d0,d6
beq.s .NoPubScreen
move.l d0,a3
move.l sc_FirstWindow(a3),d5
beq.s .freeall
move.l d5,a0
.loop move.l wd_NextWindow(a0),d5
bsr WindowClose
move.l d5,a0
move.l wd_NextWindow(a0),d5
beq.s .closelast ;kein weiteres Fenster
bra.s .loop
.closelast
bsr WindowClose ;letztes Fenster schließen
*----Alles freigeben-------------------------------------------------
.freeall suba.l a0,a0
move.l d6,a1
jsr _LVOUnlockPubScreen(a6)
.NoPubScreen move.l _IOReq,a0
bsr _CloseDevice
.NoDev move.l _IntBase,a1
move.l $4.w,a6
jsr _LVOCloseLibrary(a6)
.NoInt moveq #0,d0
rts
*******************************************************************
* WindowClose *
* *
* Funktion: sendet IDCMP_CLOSEWINDOW an ang. Window *
* Eingabe : a0=Ptr auf Window *
* Ausgabe : d0=TRUE/FALSE *
* *
* Bemerkung: IntBase und _IOReq müssen korrekt initialisiert sein!*
*******************************************************************
WindowClose movem.l d1-a6,-(sp)
move.l a0,a4 Testen, ob
move.l wd_IDCMPFlags(a4),d0 auf das Flag
and.l #IDCMP_CLOSEWINDOW,d0 gewartet
cmp.l #IDCMP_CLOSEWINDOW,d0 wird
bne.s .noclosegg NEIN -> ab!
move.l a4,a0 Gewünschtes
move.l _IntBase,a6 Fenster aktivieren
jsr _LVOActivateWindow(a6)
move.l _IOReq,a0 IOReq nach a0
lea inputEvent(pc),a1 inputEvent nach a1
move.b #IECLASS_CLOSEWINDOW,ie_Class(a1) Msg setzen
bsr _IDWriteEvent und Msg senden
.weiter moveq #1,d0 TRUE
bra.s .weg
.noclosegg ;*--Kein CloseGadget vorhanden, Benutzer aufmerksam machen-
moveq #0,d0 FALSE
.weg movem.l (sp)+,d1-a6
rts
*********************************************************************
* _OpenDevice *
* *
* Funktion: Device öffnen *
* Eingabe : a0=ptr auf Namen (z.B. "audio.device",0) *
* d0=Unit *
* d1=Länge d. IORequest - Blockes *
* Ausgabe : d0=ptr auf IOreq oder NULL bei Fehler *
* *
* Bemerkung : nutzt Funktionen des V36++ OS *
*********************************************************************
_OpenDevice movem.l d1-a6,-(sp)
move.l a0,a4 Namen retten
move.l d0,d7 Unit retten
move.l d1,d6 Länge retten
move.l 4.w,a6
jsr _LVOCreateMsgPort(a6)
move.l d0,a3
beq.s .noPort
move.l d6,d0
jsr _LVOCreateIORequest(a6)
move.l d0,a2
beq.s .noIoreq
move.l a4,a0 Namen nach a0
move.l d7,d0 Unit nach d0
move.l a2,a1 IORequest nach a1
moveq #0,d1 keine Flags
jsr _LVOOpenDevice(a6)
tst d0 Rückgabe testen
beq.s .ok d0=0, alles Ok
.noDevice move.l a2,a0 IOreq nach a0
jsr _LVODeleteIORequest(a6)
.noIoreq move.l a3,a0 Port nach a0
jsr _LVODeleteMsgPort(a6)
.noPort moveq #0,d0 Rückwert FALSE setzen
bra.s .weg
.ok move.l a2,d0 IORequest nach d0
.weg movem.l (sp)+,d1-a6
rts
*********************************************************************
* _CloseDevice *
* *
* Funktion: schließt Device und gibt alle Resourcen frei *
* Eingabe : a0=ptr auf IOreq *
* Ausgabe : ---------------- *
* *
* Bemerkung: benutzt Funktionen des V36++ OS *
*********************************************************************
_CloseDevice movem.l d0-a6,-(sp)
move.l a0,d0 testen, ob IOreq
beq.s .weg existiert!
move.l a0,a5 IOreq nach a5
move.l $4.w,a6 ExecBase nach a6
.closedev move.l IO_DEVICE(a0),d0 Testen, ob Device
beq.s .closemp zu öffnen war!
move.l a0,a1 ja!
jsr _LVOCloseDevice(a6) Schließen
.closemp move.l MN_REPLYPORT(a5),d0 Testen, ob Port
beq.s .closeIOreq zu öffnen war!
move.l d0,a0 ja!
jsr _LVODeleteMsgPort(a6) Schließen
.closeIOreq move.l a5,a0 IOreq schließen
jsr _LVODeleteIORequest(a6)
.weg movem.l (sp)+,d0-a6 Register vom Stack
rts und weg
*********************************************************************
* _IDWriteEvent *
* *
* Funktion: InputEvent an das aktuelle Window schicken *
* Eingabe : a0=ptr auf IOreq *
* a1=ptr auf inputEvent *
* Ausgabe : d0=ERROR *
* *
*********************************************************************
_IDWriteEvent movem.l d1/a0-a2/a6,-(sp)
move.l a1,IO_DATA(a0) inputEvent eintragen
move.l #ie_SIZEOF,IO_LENGTH(a0) größe eintragen
move.l a0,a1 IOReq nach a1 für DoIo
move.l a0,a2 IOReq retten
move #IND_WRITEEVENT,IO_COMMAND(a1)
move.l $4.w,a6
jsr _LVODoIO(a6) Prozedur ausführen
moveq #0,d0 d0 löschen
move.b IO_ERROR(a2),d0 Error Byte holen
movem.l (sp)+,d1/a0-a2/a6
rts
*----Texte und Strukturen--------------------------------------------
Version: dc.b "$VER WindowClose V0.01 (10.11.93)",0
even
IntName dc.b "intuition.library",0
even
InpName dc.b "input.device",0
even
WBenchName dc.b "Workbench",0
even
_IntBase dc.l 0
_IOReq dc.l 0
inputEvent ds.b ie_SIZEOF
END